package br.com.edumobi.activities;

import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.speech.tts.TextToSpeech;
import android.view.WindowManager;
import android.widget.Toast;

import java.util.Date;

import br.com.edumobi.dados.DadosLocal;
import br.com.edumobi.dados.DadosNuvem;
import br.com.edumobi.dados.IDadosLocal;
import br.com.edumobi.dados.IDadosNuvem;
import br.com.edumobi.P;
import br.com.edumobi.dados.modelos.Aluno;
import br.com.edumobi.dados.modelos.Cidade;
import br.com.edumobi.dados.modelos.Endereco;
import br.com.edumobi.dados.modelos.enuns.Sexo;
import br.com.edumobi.dados.modelos.enuns.UF;
import br.com.edumobi.fragments.GenericoFragment;
import br.com.edumobi.utils.Dates;

public abstract class GenericaActivity extends Activity implements GenericoFragment.AcoesGenericoFragment{

    private TextToSpeech speech;
    private boolean speakAllowed;

    protected SharedPreferences preferences;
    protected SharedPreferences.Editor preferencesEditor;

    protected static IDadosLocal local;
    protected static IDadosNuvem nuvem;

    TextToSpeech.OnInitListener speechOnInitListener = new TextToSpeech.OnInitListener() {
        @Override
        public void onInit(int status) {
        if (status == TextToSpeech.SUCCESS) {
            int result = speech.setLanguage(P.LOCALE_DEFAULT);
            if (result != TextToSpeech.LANG_MISSING_DATA && result != TextToSpeech.LANG_NOT_SUPPORTED) {
                speakAllowed = true;
            }
        }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

        speech = new TextToSpeech(this, speechOnInitListener);

        preferences = getSharedPreferences(P.SHARED_PREFERENCES, P.SHARED_PREFERENCES_MODE);
        preferencesEditor = preferences.edit();
        preferencesEditor.apply();

        local = new DadosLocal(this);
        nuvem = new DadosNuvem();

        /* Desativa a checagem do uso de funcoes HTTP na MainThread
            if (android.os.Build.VERSION.SDK_INT > 9) {
                StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
                StrictMode.setThreadPolicy(policy);
            }
        */
    }

    @Override
    protected void onDestroy() {
        if (speech != null) {
            speech.stop();
            speech.shutdown();
        }

        super.onDestroy();
    }

    @Override
    public void salvarPreferencesAluno(Aluno aluno) {
        if (aluno != null) {
            preferencesEditor.putLong(P.PREFERENCES_USUARIO_ID, aluno.id);
            preferencesEditor.putString(P.PREFERENCES_USUARIO_NOME, aluno.nome);
            preferencesEditor.putString(P.PREFERENCES_USUARIO_EMAIL, aluno.email);
            preferencesEditor.putString(P.PREFERENCES_USUARIO_SENHA, aluno.senha);
            preferencesEditor.putString(P.PREFERENCES_USUARIO_CPF, aluno.cpf);
            preferencesEditor.putString(P.PREFERENCES_USUARIO_SEXO, aluno.sexo != null ? aluno.sexo.sexo : P.STRING_NULL);
            preferencesEditor.putString(P.PREFERENCES_USUARIO_MATRICULA, aluno.matricula);
            preferencesEditor.putString(P.PREFERENCES_USUARIO_DATA_DE_NASCIMENTO, Dates.dateParaString(aluno.dataDeNascimento));
            preferencesEditor.putString(P.PREFERENCES_USUARIO_ENDERECO_LOGRADOURO, aluno.endereco != null ? aluno.endereco.logradouro : P.STRING_NULL);
            preferencesEditor.putString(P.PREFERENCES_USUARIO_ENDERECO_NUMERO, aluno.endereco != null ? aluno.endereco.numero : P.STRING_NULL);
            preferencesEditor.putString(P.PREFERENCES_USUARIO_ENDERECO_COMPLEMENTO, aluno.endereco != null ? aluno.endereco.complemento : P.STRING_NULL);
            preferencesEditor.putString(P.PREFERENCES_USUARIO_ENDERECO_BAIRRO, aluno.endereco != null ? aluno.endereco.bairro : P.STRING_NULL);
            preferencesEditor.putString(P.PREFERENCES_USUARIO_ENDERECO_CEP, aluno.endereco != null ? aluno.endereco.cep : P.STRING_NULL);
            preferencesEditor.putLong(P.PREFERENCES_USUARIO_ENDERECO_CIDADE_ID, aluno.endereco != null && aluno.endereco.cidade != null ? aluno.endereco.cidade.id : P.LONG_NULL);
            preferencesEditor.putString(P.PREFERENCES_USUARIO_ENDERECO_CIDADE_NOME, aluno.endereco != null && aluno.endereco.cidade != null ? aluno.endereco.cidade.nome : P.STRING_NULL);
            preferencesEditor.putInt(P.PREFERENCES_USUARIO_ENDERECO_CIDADE_UF, aluno.endereco != null && aluno.endereco.cidade != null ? aluno.endereco.cidade.uf.id : P.INT_NULL);
            preferencesEditor.putString(P.PREFERENCES_USUARIO_TELEFONE_RESIDENCIAL, aluno.telefoneResidencial);
            preferencesEditor.putString(P.PREFERENCES_USUARIO_TELEFONE_CELULAR, aluno.telefoneCelular);

            preferencesEditor.commit();
        }
    }

    @Override
    public Aluno obterPreferencesAluno() {
        return new Aluno(
                preferences.getLong(P.PREFERENCES_USUARIO_ID, P.LONG_NULL),
                preferences.getString(P.PREFERENCES_USUARIO_NOME, P.STRING_NULL),
                preferences.getString(P.PREFERENCES_USUARIO_CPF, P.STRING_NULL),
                preferences.getString(P.PREFERENCES_USUARIO_EMAIL, P.STRING_NULL),
                preferences.getString(P.PREFERENCES_USUARIO_SENHA, P.STRING_NULL),
                Sexo.getEnum(preferences.getString(P.PREFERENCES_USUARIO_SEXO, P.STRING_NULL)),
                preferences.getString(P.PREFERENCES_USUARIO_MATRICULA, P.STRING_NULL),
                Dates.stringParaDate(preferences.getString(P.PREFERENCES_USUARIO_DATA_DE_NASCIMENTO, P.STRING_NULL)),
                new Endereco(
                        preferences.getString(P.PREFERENCES_USUARIO_ENDERECO_LOGRADOURO, P.STRING_NULL),
                        preferences.getString(P.PREFERENCES_USUARIO_ENDERECO_NUMERO, P.STRING_NULL),
                        preferences.getString(P.PREFERENCES_USUARIO_ENDERECO_COMPLEMENTO, P.STRING_NULL),
                        preferences.getString(P.PREFERENCES_USUARIO_ENDERECO_BAIRRO, P.STRING_NULL),
                        preferences.getString(P.PREFERENCES_USUARIO_ENDERECO_CEP, P.STRING_NULL),
                        new Cidade(
                                preferences.getLong(P.PREFERENCES_USUARIO_ENDERECO_CIDADE_ID, P.LONG_NULL),
                                preferences.getString(P.PREFERENCES_USUARIO_ENDERECO_CIDADE_NOME, P.STRING_NULL),
                                UF.getEnum(preferences.getInt(P.PREFERENCES_USUARIO_ENDERECO_CIDADE_UF, P.INT_NULL))
                        )
                ),
                preferences.getString(P.PREFERENCES_USUARIO_TELEFONE_RESIDENCIAL, P.STRING_NULL),
                preferences.getString(P.PREFERENCES_USUARIO_TELEFONE_CELULAR, P.STRING_NULL)
        );
    }

    @Override
    public void salvarPreferencesDataAtualizacao(Date dataDeAtualizacao) {
        preferencesEditor.putString(P.PREFERENCES_DATA_ATUALIZACAO, Dates.dateParaString(dataDeAtualizacao));
        preferencesEditor.commit();
    }

    @Override
    public Date obterPreferencesDataAtualizacao() {
        return Dates.stringParaDate(preferences.getString(P.PREFERENCES_DATA_ATUALIZACAO, P.STRING_NULL));
    }

    @Override
    public void salvarPreferencesUsuAssistenteVirtual(boolean usarAssistente) {
        preferencesEditor.putBoolean(P.PREFERENCES_USU_ASSISTENTE_VIRTUAL, usarAssistente);
        preferencesEditor.commit();
    }

    @Override
    public boolean obterPreferencesUsuAssistenteVirtual() {
        return preferences.getBoolean(P.PREFERENCES_USU_ASSISTENTE_VIRTUAL, false);
    }

    @Override
    public void falarTexto(int idString) {
        if (speakAllowed) {
            if (falando()) {
                speech.stop();
            }
            speech.speak(getResources().getText(idString).toString(), TextToSpeech.QUEUE_FLUSH, null);
        }
    }

    @Override
    public void falarTextoNaFila(String string) {
        if (speakAllowed) {
            speech.speak(string, TextToSpeech.QUEUE_ADD, null);
        }
    }

    @Override
    public void falarTextoNaFila(int idString) {
        if (speakAllowed) {
            speech.speak(getResources().getText(idString).toString(), TextToSpeech.QUEUE_ADD, null);
        }
    }

    @Override
    public void exibirTexto(int idString) {
        Toast.makeText(this, getResources().getText(idString).toString(), Toast.LENGTH_SHORT).show();
    }

    @Override
    public void falarEExibirTexto(int idString) {
        exibirTexto(idString);
        falarTexto(idString);
    }

    @Override
    public boolean falando() {
        return speech.isSpeaking();
    }

    @Override
    public boolean conectado() {
        NetworkInfo networkInfo = ((ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo();
        return (networkInfo != null && networkInfo.isConnected());
    }

    @Override
    public void finalizar() {
        finish();
    }
}